From: Zeeshan Ali (Khattak) Date: Mon, 17 Feb 2014 01:25:13 +0000 (+0000) Subject: location: Allow user to disable GPS X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~2766 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=5d05b669024b7115fc9b6e128961655c5d105d34;p=gnome-shell.git location: Allow user to disable GPS When exact accuracy (i-e GPS) is available, allow user to disable that. When users don't want application to get their precise location, they can now opt for network-based geolocation only, which can be street-level at best. https://bugzilla.gnome.org/show_bug.cgi?id=723684 --- diff --git a/js/ui/status/location.js b/js/ui/status/location.js index 5661b57ce..07fa611ed 100644 --- a/js/ui/status/location.js +++ b/js/ui/status/location.js @@ -35,6 +35,14 @@ var AgentIface = ' \ \ '; +const AccuracyLevel = { + NONE: 0, + COUNTRY: 1, + CITY: 4, + STREET: 6, + EXACT: 8, +}; + const Indicator = new Lang.Class({ Name: 'LocationIndicator', Extends: PanelMenu.SystemIndicator, @@ -61,6 +69,18 @@ const Indicator = new Lang.Class({ this._item.status.text = _("On"); this._onoffAction = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, this._onOnOffAction)); + this._accurateItem = new PopupMenu.PopupMenuItem(_("Accurate (GPS + Network)"), false); + this._accurateItem.connect('activate', Lang.bind(this, this._onAccurateItemActivated)); + this._item.menu.addMenuItem(this._accurateItem); + + this._powerSavingItem = new PopupMenu.PopupMenuItem(_("Power Saving (Network Only)"), false); + this._powerSavingItem.connect('activate', Lang.bind(this, this._onPowerSavingItemActivated)); + this._item.menu.addMenuItem(this._powerSavingItem); + + this._offItem = new PopupMenu.PopupMenuItem(_("Off"), false); + this._offItem.connect('activate', Lang.bind(this, this._onOffItemActivated)); + this._item.menu.addMenuItem(this._offItem); + this.menu.addMenuItem(this._item); this._watchId = Gio.bus_watch_name(Gio.BusType.SYSTEM, @@ -150,16 +170,48 @@ const Indicator = new Lang.Class({ if (this._getMaxAccuracyLevel() == 0) this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel); else - this._settings.set_enum(MAX_ACCURACY_LEVEL, 0); + this._settings.set_enum(MAX_ACCURACY_LEVEL, AccuracyLevel.NONE); + }, + + _onAccurateItemActivated: function() { + this._settings.set_enum(MAX_ACCURACY_LEVEL, AccuracyLevel.EXACT); + }, + + _onPowerSavingItemActivated: function() { + this._settings.set_enum(MAX_ACCURACY_LEVEL, AccuracyLevel.STREET); + }, + + _onOffItemActivated: function() { + this._settings.set_enum(MAX_ACCURACY_LEVEL, AccuracyLevel.NONE); }, _onMaxAccuracyLevelChanged: function() { - if (this._getMaxAccuracyLevel() == 0) { - this._item.status.text = _("Off"); - this._onoffAction.label.text = "Turn On"; + let maxAccuracyLevel = this._getMaxAccuracyLevel(); + if (this._availableAccuracyLevel < AccuracyLevel.EXACT) { + if (maxAccuracyLevel == 0) { + this._item.status.text = _("Off"); + this._onoffAction.label.text = "Turn On"; + } else { + this._item.status.text = _("On"); + this._onoffAction.label.text = "Turn Off"; + } } else { - this._item.status.text = _("On"); - this._onoffAction.label.text = "Turn Off"; + if (maxAccuracyLevel == 0) { + this._item.status.text = _("Off"); + this._offItem.setOrnament(PopupMenu.Ornament.DOT); + this._accurateItem.setOrnament(PopupMenu.Ornament.NONE); + this._powerSavingItem.setOrnament(PopupMenu.Ornament.NONE); + } else if (maxAccuracyLevel < AccuracyLevel.EXACT) { + this._item.status.text = _("Power Saving"); + this._powerSavingItem.setOrnament(PopupMenu.Ornament.DOT); + this._accurateItem.setOrnament(PopupMenu.Ornament.NONE); + this._offItem.setOrnament(PopupMenu.Ornament.NONE); + } else { + this._item.status.text = _("Accurate"); + this._accurateItem.setOrnament(PopupMenu.Ornament.DOT); + this._offItem.setOrnament(PopupMenu.Ornament.NONE); + this._powerSavingItem.setOrnament(PopupMenu.Ornament.NONE); + } } // Gotta ensure geoclue is up and we are registered as agent to it @@ -180,6 +232,22 @@ const Indicator = new Lang.Class({ _updateMenu: function() { this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel; this.menu.actor.visible = (this._availableAccuracyLevel != 0); + if (this._availableAccuracyLevel == 0) + return; + + if (this._availableAccuracyLevel < AccuracyLevel.EXACT) { + this._onoffAction.actor.show(); + this._accurateItem.actor.hide(); + this._powerSavingItem.actor.hide(); + this._offItem.actor.hide(); + } else { + this._onoffAction.actor.hide(); + this._accurateItem.actor.show(); + this._powerSavingItem.actor.show(); + this._offItem.actor.show(); + } + + this._onMaxAccuracyLevelChanged(); }, _onGeocluePropsChanged: function(proxy, properties) {